// 购物车状态
import { insertCart, findCartList, deleteCart, updateCart, checkAllCart } from '@/api/cart'
export default {
  namespaced: true,
  state() {
    return {
      CartList: []
    }
  },
  mutations: {
    // 保存购物车中的商品列表
    setCartList(state, payload) {
      state.CartList = payload
    },
    // 退出时清空购物车
    removeCartList(state) {
      state.CartList = []
    }
  },
  actions: {
    // 获取购物车列表数据
    async asyncSetCartList(ctx, { skuId, count }) {
      // 1. 调用加入购物车接口 inserCart
      await insertCart({ skuId, count })
      // 2. 调用获取最新的购物车列表接口 findCartList -> list
      const res = await findCartList()
      // 把获取到的购物列表交给state
      ctx.commit('setCartList', res.result)
    },
    // 删除购物车中的数据
    async delCart(ctx, payload) {
      // 删除
      await deleteCart(payload)
      // 重新调用获取购物车列表数据,将数据存储起来
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
      // console.log(skuid)
    },
    // 更新购物车列表数据
    async updateCatlist(ctx) {
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
    },
    // 更新商品单选状态
    async updateChack(ctx, payload) {
      // 调用更新选中状态接口
      await updateCart(payload)
      // 重新获取购物车列表数据
      const res = await findCartList()
      // 3. 更新state
      ctx.commit('setCartList', res.result)
    },
    // 更新商品多选状态
    async AllCheck(ctx, selected) {
      const allSkuId = ctx.state.CartList.map(item => item.skuId)
      await checkAllCart({
        selected,
        ids: allSkuId
      })
      // 重新获取购物车数据
      const res = await findCartList()
      ctx.commit('setCartList', res.result)
    },
    // 更新购物车中商品的数量
    async changeCount(context, goods) {
      // 1. 调用接口，修改商品的数量
      await updateCart(goods)
      // 2. 重新从购物车取出最新的数据
      const res = await findCartList()
      console.log(res)
      // 3. 更新state
      context.commit('setCartList', res.result)
    },
    // 删除购物车操作
    async asyncDelCart(ctx, ids) {
      // 1. 调用删除接口
      await deleteCart(ids)
      // 2. 调用获取最新的购物车列表接口 findCartList -> list
      const res = await findCartList()
      // 把获取到的购物列表交给state
      ctx.commit('setCartList', res.result)
    }
  },
  getters: {
    // 购物车中总商品数量
    allCount(state) {
      // reduce(cur,arr)方法 cur为初始值0，arr为要循环的每一项值
      const total = state.CartList.reduce((acc, cur) => {
        return acc + cur.count
      }, 0)
      return total
    },
    // 购物车中总商品价格
    allPrice(state) {
      const total = state.CartList.reduce((acc, cur) => {
        return acc + cur.count * cur.price
      }, 0)
      return total
    },
    // 计算购物车选中的商品数量
    selectedCount(state) {
      return state.CartList.filter(item => item.selected).reduce((acc, cur) => {
        return acc + cur.count
      }, 0)
    },
    // 计算购物车选中商品的总价格
    selectedPrice(state) {
      return state.CartList.filter(item => item.selected).reduce((acc, cur) => {
        return acc + cur.count * cur.price
      }, 0)
    }
  }
}
